home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / src / demos / REALITY / distort / imagedata.c < prev    next >
C/C++ Source or Header  |  1994-08-01  |  4KB  |  149 lines

  1. /*
  2.  * Copyright 1993, 1994, Silicon Graphics, Inc.
  3.  * All Rights Reserved.
  4.  *
  5.  * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
  6.  * the contents of this file may not be disclosed to third parties, copied or
  7.  * duplicated in any form, in whole or in part, without the prior written
  8.  * permission of Silicon Graphics, Inc.
  9.  *
  10.  * RESTRICTED RIGHTS LEGEND:
  11.  * Use, duplication or disclosure by the Government is subject to restrictions
  12.  * as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
  13.  * and Computer Software clause at DFARS 252.227-7013, and/or in similar or
  14.  * successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
  15.  * rights reserved under the Copyright Laws of the United States.
  16.  */
  17. /*
  18.     imagedata.c
  19.  
  20.     Taken from the 'ipaste.c' source in 4Dgifts.
  21. */
  22.  
  23. #include <stdio.h>
  24. #include <gl/image.h>
  25.  
  26. #include "imagedata.h"
  27.  
  28. unsigned long *longimagedata(name, width, height)
  29. char *name;
  30. int *width, *height;
  31. {
  32.     long *base, *lptr;
  33.     short *rbuf, *gbuf, *bbuf, *abuf;
  34.     IMAGE *image;
  35.     int y;
  36.  
  37.     image = iopen(name,"r");
  38.     if(!image)
  39.     return NULL;
  40.     (*width)=image->xsize;
  41.     (*height)=image->ysize;
  42.     base = (long *)malloc(image->xsize*image->ysize*sizeof(long));
  43.     rbuf = (short *)malloc(image->xsize*sizeof(short));
  44.     gbuf = (short *)malloc(image->xsize*sizeof(short));
  45.     bbuf = (short *)malloc(image->xsize*sizeof(short));
  46.     abuf = (short *)malloc(image->xsize*sizeof(short));
  47.     if(!base || !rbuf || !gbuf || !bbuf)
  48.       return NULL;
  49.     lptr = base;
  50.     for(y=0; y<image->ysize; y++) {
  51.     if(image->zsize>=4) {
  52.         getrow(image,rbuf,y,0);
  53.         getrow(image,gbuf,y,1);
  54.         getrow(image,bbuf,y,2);
  55.         getrow(image,abuf,y,3);
  56.         rgbatocpack(rbuf,gbuf,bbuf,abuf,lptr,image->xsize);
  57.         lptr += image->xsize;
  58.     } else if(image->zsize==3) {
  59.         getrow(image,rbuf,y,0);
  60.         getrow(image,gbuf,y,1);
  61.         getrow(image,bbuf,y,2);
  62.         rgbtocpack(rbuf,gbuf,bbuf,lptr,image->xsize);
  63.         lptr += image->xsize;
  64.     } else {
  65.         getrow(image,rbuf,y,0);
  66.         bwtocpack(rbuf,lptr,image->xsize);
  67.         lptr += image->xsize;
  68.     }
  69.     }
  70.     iclose(image);
  71.     free(rbuf);
  72.     free(gbuf);
  73.     free(bbuf);
  74.     free(abuf);
  75.  
  76.     return (unsigned long *) base;
  77. }
  78.  
  79. bwtocpack(b,l,n)
  80. register unsigned short *b;
  81. register unsigned long *l;
  82. register int n;
  83. {
  84.     while(n>=8) {
  85.     l[0] = 0x00010101*b[0];
  86.     l[1] = 0x00010101*b[1];
  87.     l[2] = 0x00010101*b[2];
  88.     l[3] = 0x00010101*b[3];
  89.     l[4] = 0x00010101*b[4];
  90.     l[5] = 0x00010101*b[5];
  91.     l[6] = 0x00010101*b[6];
  92.     l[7] = 0x00010101*b[7];
  93.     l += 8;
  94.     b += 8;
  95.     n -= 8;
  96.     }
  97.     while(n--) 
  98.     *l++ = 0x00010101*(*b++);
  99. }
  100.  
  101. rgbtocpack(r,g,b,l,n)
  102. register unsigned short *r, *g, *b;
  103. register unsigned long *l;
  104. register int n;
  105. {
  106.     while(n>=8) {
  107.     l[0] = r[0] | (g[0]<<8) | (b[0]<<16);
  108.     l[1] = r[1] | (g[1]<<8) | (b[1]<<16);
  109.     l[2] = r[2] | (g[2]<<8) | (b[2]<<16);
  110.     l[3] = r[3] | (g[3]<<8) | (b[3]<<16);
  111.     l[4] = r[4] | (g[4]<<8) | (b[4]<<16);
  112.     l[5] = r[5] | (g[5]<<8) | (b[5]<<16);
  113.     l[6] = r[6] | (g[6]<<8) | (b[6]<<16);
  114.     l[7] = r[7] | (g[7]<<8) | (b[7]<<16);
  115.     l += 8;
  116.     r += 8;
  117.     g += 8;
  118.     b += 8;
  119.     n -= 8;
  120.     }
  121.     while(n--) 
  122.         *l++ = *r++ | ((*g++)<<8) | ((*b++)<<16);
  123. }
  124.  
  125. rgbatocpack(r,g,b,a,l,n)
  126. register unsigned short *r, *g, *b, *a;
  127. register unsigned long *l;
  128. register int n;
  129. {
  130.     while(n>=8) {
  131.     l[0] = r[0] | (g[0]<<8) | (b[0]<<16) | (a[0]<<24);
  132.     l[1] = r[1] | (g[1]<<8) | (b[1]<<16) | (a[1]<<24);
  133.     l[2] = r[2] | (g[2]<<8) | (b[2]<<16) | (a[2]<<24);
  134.     l[3] = r[3] | (g[3]<<8) | (b[3]<<16) | (a[3]<<24);
  135.     l[4] = r[4] | (g[4]<<8) | (b[4]<<16) | (a[4]<<24);
  136.     l[5] = r[5] | (g[5]<<8) | (b[5]<<16) | (a[5]<<24);
  137.     l[6] = r[6] | (g[6]<<8) | (b[6]<<16) | (a[6]<<24);
  138.     l[7] = r[7] | (g[7]<<8) | (b[7]<<16) | (a[7]<<24);
  139.     l += 8;
  140.     r += 8;
  141.     g += 8;
  142.     b += 8;
  143.     a += 8;
  144.     n -= 8;
  145.     }
  146.     while(n--) 
  147.         *l++ = *r++ | ((*g++)<<8) | ((*b++)<<16) | ((*a++)<<24);
  148. }
  149.